package com.morty.config;

import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @Author:
 * @Date:
 * @Description:
 */
@Component
@Primary
@AllArgsConstructor
public class MySwaggerResourceProvider implements SwaggerResourcesProvider {

	/**
	 * swagger2默认的url后缀
	 */
	private static final String SWAGGER2URL = "/v2/api-docs";

	/**
	 * 网关路由
	 */
	private final RouteLocator routeLocator;

	/**
	 * 网关应用名称
	 */
	@Value("${spring.application.name}")
	private String self;

	@Value("${swagger.groups}")
	private String commonServiceGroups;

	@Autowired
	public MySwaggerResourceProvider(RouteLocator routeLocator) {
		this.routeLocator = routeLocator;
	}

	@Override
	public List<SwaggerResource> get() {
		List<SwaggerResource> resources = new ArrayList<>();
		List<String> routeHosts = new ArrayList<>();
		// 获取所有可用的host：serviceId
		routeLocator.getRoutes().filter(route -> route.getUri().getHost() != null)
				.filter(route -> !self.equals(route.getUri().getHost()))
				.subscribe(route -> routeHosts.add(route.getUri().getHost()));

		// 记录已经添加过的server，存在同一个应用注册了多个服务在nacos上
		Set<String> dealed = new HashSet<>();
		routeHosts.forEach(instance -> {
			// 拼接url
			String url = "/" + instance.toLowerCase() + SWAGGER2URL;
			if (!dealed.contains(url)) {
				dealed.add(url);
				SwaggerResource swaggerResource = new SwaggerResource();
				swaggerResource.setUrl(url);
				swaggerResource.setName(instance);
				swaggerResource.setSwaggerVersion("2.0");
				resources.add(swaggerResource);
			}
		});
		return resources;
	}

	private SwaggerResource swaggerResource(String name, String location) {
		SwaggerResource swaggerResource = new SwaggerResource();
		swaggerResource.setName(name);
		swaggerResource.setLocation(location);
		swaggerResource.setSwaggerVersion("2.0");
		return swaggerResource;
	}
}
